package com.cqrt.util;

import com.cqrt.mapper.RTProjectCodeMapper;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * 项目编码生成工具类
 */
@Component
public class ProjectCodeGenerator {


    @Resource
    private RTProjectCodeMapper codeSeqMapper;

    // 日期格式化：仅获取年份（YYYY）
    private static final SimpleDateFormat YEAR_FORMAT = new SimpleDateFormat("yyyy");
    // 流水码格式化：4位补0（如 1 → 0001）
    private static final String SEQ_FORMAT = "%04d";

    /**
     * 生成项目编码（年份+4位流水码）
     * @return 项目编码（如 20240001）
     */
    public  String generateProjectCode() {
        // 1. 获取当前年份
        int currentYear = Integer.parseInt(YEAR_FORMAT.format(new Date()));

        // 2. 检查并初始化当前年份的流水记录
        codeSeqMapper.initYearSeq(currentYear);

        // 3. 锁定查询当前年份的最大流水码（Oracle行锁）
        Integer maxSeq = codeSeqMapper.getMaxSeqWithLock(currentYear);
        if (maxSeq == null) {
            maxSeq = 0; // 首次使用时默认为0
        }

        // 4. 计算新流水码
        int newSeq = maxSeq + 1;
        if (newSeq > 9999) {
            throw new RuntimeException("当前年份[" + currentYear + "]项目编码已达上限（9999）");
        }

        // 5. 更新流水码
        codeSeqMapper.updateMaxSeq(currentYear, newSeq);

        // 6. 拼接编码并返回
        return currentYear + String.format(SEQ_FORMAT, newSeq);
    }


}